/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Example filter that can be attached to either an individual servlet or to a
 * URL pattern. This filter performs the following functions:
 * <ul>
 * <li>Attaches itself as a request attribute, under the attribute name defined
 * by the value of the <code>attribute</code> initialization parameter.</li>
 * <li>Calculates the number of milliseconds required to perform the servlet
 * processing required by this request, including any subsequently defined
 * filters, and logs the result to the servlet context log for this application.
 * </ul>
 * 
 * @author Craig McClanahan
 * @version $Revision: 500674 $ $Date: 2007-01-28 07:15:00 +0800 (星期日, 28 一月
 *          2007) $
 */

public final class ExampleFilter implements Filter {

	// ----------------------------------------------------- Instance Variables

	/**
	 * The request attribute name under which we store a reference to ourself.
	 */
	private String attribute = null;

	/**
	 * The filter configuration object we are associated with. If this value is
	 * null, this filter instance is not currently configured.
	 */
	private FilterConfig filterConfig = null;

	// --------------------------------------------------------- Public Methods

	/**
	 * Take this filter out of service.
	 */
	public void destroy() {

		this.attribute = null;
		this.filterConfig = null;

	}

	/**
	 * Time the processing that is performed by all subsequent filters in the
	 * current filter stack, including the ultimately invoked servlet.
	 * 
	 * @param request
	 *            The servlet request we are processing
	 * @param result
	 *            The servlet response we are creating
	 * @param chain
	 *            The filter chain we are processing
	 * 
	 * @exception IOException
	 *                if an input/output error occurs
	 * @exception ServletException
	 *                if a servlet error occurs
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

		// Store ourselves as a request attribute (if requested)
		if (attribute != null)
			request.setAttribute(attribute, this);

		// Time and log the subsequent processing
		long startTime = System.currentTimeMillis();
		chain.doFilter(request, response);
		long stopTime = System.currentTimeMillis();
		filterConfig.getServletContext().log(
				this.toString() + ": " + (stopTime - startTime)
						+ " milliseconds");

	}

	/**
	 * Place this filter into service.
	 * 
	 * @param filterConfig
	 *            The filter configuration object
	 */
	public void init(FilterConfig filterConfig) throws ServletException {

		this.filterConfig = filterConfig;
		this.attribute = filterConfig.getInitParameter("attribute");

	}

	/**
	 * Return a String representation of this object.
	 */
	public String toString() {

		if (filterConfig == null)
			return ("InvokerFilter()");
		StringBuffer sb = new StringBuffer("InvokerFilter(");
		sb.append(filterConfig);
		sb.append(")");
		return (sb.toString());

	}

}
